/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DBLag;
import ModelLag.Event;
import java.sql.*;
import java.util.ArrayList;

/**
 * Databaseklasse for Event som står for kommunikationen til databasen og som står
 * for opbygningen af Event objekter som skal bruges i de højere lag.
 * @author DM75 Gruppe 3
 * @version 2011-12-22
 */
public class DbEvent implements IFDbEvent
{
    //Forbindelse til databasen.
    private Connection con;
    
    // En instans variabel af typen PreparedStatement som indeholder et PreparedStatement
    // til brug ved findmetode.
    private PreparedStatement pStmtSelect;
    
    public DbEvent()
    {
        con = DbConnection1.getInstance().getDBcon();
    }
    
    /**
     * Finder en event i databasen og sørger for at det bliver bygget op til et 
     * objekt ved hjælp af buildEvent() og event navn, pris per person og pris per person kun spisning.
     * @param eventName arrangement navn.
     * @return Hvis fundet returneres et Event objekt ellers null.
     */    
    @Override
    public Event findEvent(String eventName)
    {
        if(pStmtSelect == null)
        {
            pStmtSelect = getPreparedStmt();
        }
        Event eventObj = null;
        ResultSet results;
        
        try
        {
            pStmtSelect.setString(1, eventName);
            results = pStmtSelect.executeQuery();
            if(results.next())
            {
                eventObj = buildEvent(results);
            }
        }
        catch(SQLException sqlE)
        {
            System.out.println(sqlE.getMessage());
            System.out.println("SQL Error");
        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
        
        return eventObj;  
    }
 
    /**
     * Henter alle rækker i Event tabellen i databasen og bygger dem op til objekter ved hjælp af
     * buildEvent() og derefter tilføjes hvert objekt til en ArrayList.
     * @return ArrayList med alle event som findes i Event tabellen i databasen.
     */
    @Override
    public ArrayList<Event> getAllEvent()
    {
        ArrayList<Event> list = new ArrayList<Event>();
        PreparedStatement pstmt = null;
        
        String allEvent = "SELECT * FROM Event";
        
        //System.out.println(allEvent);
        
        Event eventObj = null;
        ResultSet results;
        
        try
        {
            pstmt = con.prepareStatement(allEvent);
            pstmt.setQueryTimeout(5);
            results = pstmt.executeQuery();
            while(results.next())
            {
               eventObj = buildEvent(results);
               list.add(eventObj);
            }
            pstmt.close();
        }
        catch(SQLException sqlE)
        {
            System.out.println(sqlE.getMessage());
            System.out.println("SQL Error");
        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
        
        return list;
    }
    
    /**
     * Indsætter et Event objekt som en række i Event tabellen i databasen.
     * @param eventObj Det objekt som ønskes indsat i Event tabellen i databasen.
     * @return -1 = mislykkedes. 1 = lykkedes.
     */    
    @Override
    public int insertEvent(Event eventObj)
    {
        int rc = -1;
        PreparedStatement pstmt = null;
        String insert = "INSERT INTO Event (eventName, pricePrPerson, pricePrPersonOnlyFood, active)" + "VALUES (?,?,?,?)";
        //System.out.println(insert);
        try
        {
            pstmt = con.prepareStatement(insert);
            pstmt.setQueryTimeout(5);
            pstmt.setString(1, eventObj.getEventName());
            pstmt.setDouble(2, eventObj.getPricePrPerson());
            pstmt.setDouble(3, eventObj.getPricePrPersonOnlyFood());
            pstmt.setInt(4, 1);
            rc = pstmt.executeUpdate();
            
            pstmt.close();
        }
        catch(SQLException sqlE)
        {
            System.out.println("SQL Error");
            System.out.println(sqlE.getMessage());

        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
        return rc;
    }
    
    
    /**
     * Sletter rækken i Event tabellen i databasen ved hjælp af parameterne.
     * @param eventName arrangement navn.
     * @return -1 = mislykkedes. 1 = lykkedes.
     */    
    @Override
    public int deleteEvent(String eventName)
    {
        int rc = -1;
        PreparedStatement pstmt = null;
        String delete = "DELETE FROM Event WHERE eventName = ?";
        //System.out.println(delete);
        try
        {
            pstmt = con.prepareStatement(delete);
            pstmt.setQueryTimeout(5);
            pstmt.setString(1, eventName);
            rc = pstmt.executeUpdate();
            
            pstmt.close();
        }
        catch(SQLException sqlE)
        {
            System.out.println("SQL Error");
            System.out.println(sqlE.getMessage()); 
        }
        catch(Exception e)
        {
            e.getMessage();
        }
        return rc;
    }
    
    
    /**
     * Opdaterer rækken i Event tabellen i databasen i forhold til event objektet.
     * @param eventObj Event objekt som er det der skal opdateres.
     * @param pricePrPerson Pris per personer.
     * @param pricePrPersonOnlyFood Pris per person som kun skal være til spisning.
     * @return -1 = mislykkedes. 1 = lykkedes.
     */    
    @Override
    public int updateEvent(Event event)
    {
        int rc = -1;
 
        String query = null;

        try
        {
        
            query = "UPDATE Event " 
                  + "SET pricePrPerson = ?, pricePrPersonOnlyFood = ? "
                  + "WHERE eventName = ?";

            PreparedStatement preStmnt = con.prepareStatement(query);
            preStmnt.setQueryTimeout(5);


            
            preStmnt.setDouble(1, event.getPricePrPerson());
            preStmnt.setDouble(2, event.getPricePrPersonOnlyFood());
            preStmnt.setString(3, event.getEventName());
            rc = preStmnt.executeUpdate();
            
            preStmnt.close();
                
        }
        catch(SQLException SQLe)
        {
            //returnerer SQL Exception
            System.out.println("SQL Error: " + SQLe.getMessage());

        }
        catch(Exception e)
        {
            //returnerer java exception
            System.out.println("ExceptionE: " + e.getMessage());

        }        
        return rc;
    }
    
    /**
     * Opbygning af Event objekt sker i denne metode.
     * @param results ResultSet. En form for tabel med resultaterne i fra det
     * preparedstatement som er sendt til databasen.
     * @return Event objekt.
     */
    private Event buildEvent(ResultSet results)
    {
        Event eventObj = new Event();
        try
        {   
            eventObj.setEventName(results.getString("eventName"));
            eventObj.setPricePrPerson(results.getDouble("pricePrPerson"));
            eventObj.setPricePrPersonOnlyFood(results.getDouble("pricePrPersonOnlyFood"));
            
        }
        catch(Exception e)
        {
            System.out.println("Error in Building Event Object");
        }
        return eventObj;
    }
    
    
    /**
     * PreparedStatement som bruges til find metoden ud fra eventName. Dette laves en gang og gemmes
     * derefter i en instans variabel, da dette preparedStatement bruges ofte kan
     * dette betale sig at gemme og derved går det hurigtere end hvis man skal til at
     * lave et nyt hver gang.
     * @return PreparedStatement objekt.
     */
    private PreparedStatement getPreparedStmt()
    {
        try
        {
            String query = "SELECT eventName, pricePrPerson, pricePrPersonOnlyFood "
                         + "FROM Event "
                         + "WHERE eventName = ?";
            //System.out.println("Preparestatement " + query);
            pStmtSelect = con.prepareStatement(query);
            pStmtSelect.setQueryTimeout(5);
        }
        catch(SQLException sqlE)
        {
            System.out.println(sqlE.getMessage());
            System.out.println("SQL Error");
        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
        }
        return pStmtSelect;
    }

    
}
